#ifndef _MOTIONOBSTACLEDEBUGDISPLAY_H
#define _MOTIONOBSTACLEDEBUGDISPLAY_H

#include <thread>
#include <mutex>
#include <chrono>
#include <vector>
#include <Eigen/Dense>
#include <string>
#include <cstdint>

#include "module_base/util.h"
#include "obstacle_detector/util.h"

namespace obstacle_detector
{

class DebugDisplay
{
public:
	DebugDisplay(std::string window_name);
	~DebugDisplay();
	void set_showinfo(const float* points_int,int point_num);
	void set_showinfo_float(const float* points,int point_num);
	void set_showinfo(const int16_t* points_int,int point_num);
	void show3Dbbox(std::vector<Object> all_bboxs);
	void show3Dbbox_compare(std::vector<Object> all_bboxs1,
		std::vector<Object> all_bboxs2);
	void set_static_area(const std::vector<Eigen::MatrixXf> &areas);
	void set_road_area(const std::vector<Eigen::MatrixXf> &areas);
	void set_vehicle_param(const module_base::VehicleParam &vehicle_param);
	void set_state(const float *states);
	void set_predict_bbox(const float *bbox,int bbox_num);

private:
	void debug_display();


private:
	std::string window_name_;
	int16_t *debug_filtered_points_;
	int debug_filtered_points_num_;
	float *debug_fitler_points_float_;
	int debug_filtered_points_num_float_;
	float *debug_points_;
	int debug_point_num_;
	std::thread thread_;
	std::mutex data_mutex_;
	std::vector<Object> all_bboxs_;
	std::vector<Eigen::MatrixXf> static_areas_;
	std::vector<Eigen::MatrixXf> road_areas_;
	std::vector<Eigen::MatrixXf> debug_vehicle_bbox_;

	std::vector<Object> all_bboxs_global1_;
	std::vector<Object> all_bboxs_global2_;

	module_base::VehicleParam vehicle_param_;

	float *predict_bbox_;
	int predict_bbox_num_;

};//class

}//namespace

#endif 